package com.mastercard.assets.web.struts.actions;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;

import com.mastercard.assets.MasterCardException;
import com.mastercard.assets.jpa.TblCuenta;
import com.mastercard.assets.jpa.TblNivel;
import com.mastercard.assets.jpa.TblRole;
import com.mastercard.assets.jpa.TblUsuario;
import com.mastercard.assets.util.MCUtil;
import com.mastercard.assets.util.dao.MasterCardDAO;
import com.mastercard.assets.web.struts.forms.CatalogoNuevoItemForm;
import com.mastercard.assets.web.util.to.UserLogin;

public class AgregarNivelAUsuarioBuscarReg
	extends
		Action
{
	public ActionForward execute(
							ActionMapping mapping , 
							ActionForm form ,
							HttpServletRequest request , 
							HttpServletResponse response )
		throws 
			IOException , 
			ServletException
	{
		HttpSession session = request.getSession( ) ;
		
		// en caos de null
		if( session == null )
			return mapping.findForward( "noLogin" ) ;
		
		// toma el userLogin
		UserLogin user = ( UserLogin ) session.getAttribute( "UserLogin" ) ;
		
		// en caso de null
		if( user == null )
			return mapping.findForward( "noLogin" ) ;
		
		// cambia el form
		CatalogoNuevoItemForm f = ( CatalogoNuevoItemForm ) form ;
		int cveUsuario = f.getRegId( ) ;
		
		try
		{
			// obtiene los roles del usuario
			List< TblNivel > userLevels = null ;
			List< TblRole > userRoles = null ;
			List< TblCuenta > userCounts = null ;
			
			if( cveUsuario == user.getCveUsuario( ) )
			{
				f.setCampo1( user.getLogin( ) ) ;
				f.setCampo2( user.getEmail( ) ) ;
				f.setCampo3( user.getUserName( ) ) ;
				f.setCampo4( user.getPaswd( ) ) ;
				userLevels = user.getUserLevels( ) ;
				userRoles = user.getUserRoles( ) ;
				userCounts = user.getUserCounts( ) ;
			}
			else
			{
				// adquiere el usuario
				TblUsuario usuario = MasterCardDAO.findUserById( cveUsuario ) ;
				
				// en caso de null
				if( usuario == null )
				{
					user.setMessageError( MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.catalogos.usuario.dao.UserNotExist" , cveUsuario ) ) ;
					
					user.setNextWorkArea( "/EditarUsuario.do?redId=" + cveUsuario ) ;
					
                                        MasterCardDAO.closeEntityManager( ) ;
					return mapping.findForward( "success" ) ;
				}
				
				// en caso de que no sea null
				// toma los roles
				userLevels = usuario.getTblNivels( ) ;
				
				userRoles = usuario.getTblRoles( ) ;
				
				userCounts = usuario.getTblCuentas( ) ;
				
				f.setCampo1( usuario.getLogin( ) ) ;
				f.setCampo2( usuario.getEmail( ) ) ;
				f.setCampo3( usuario.getNombre( ) ) ;
				f.setCampo4( usuario.getPswd( ) ) ;
			}
			
			// en caso de null
			if( userLevels == null )
				userLevels = new ArrayList< TblNivel >( ) ;
			
			// toma los usuarios del sistema
			List< TblNivel > appActiveLevels = MasterCardDAO.getAllActiveLevels( ) ;
			
			// le quita unos a otros
			appActiveLevels.removeAll( userLevels ) ;
			
			// en caso de que sea 0
			if( appActiveLevels.size( ) == 0 )
			{
				user.setMessageError( MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.catalogos.usuario.dao.NotExistOtherLevels" , f.getCampo1( ) ) ) ;
				
				request.setAttribute( "EditarUsuarioEditarForm" , f ) ;
				
				// en caso de que se cumpla, guarda el WorkArea
				user.setNextWorkArea( "/WEB-INF/pages/WorkArea/EditarUsuario.jsp" ) ;
				
				request.setAttribute( "UserLevels" , userLevels ) ;
				request.setAttribute( "UserRoles" , userRoles ) ;
				
				boolean flag = false ;
				
				// revisa si en los roles se encuentr BDM o banco
				for( TblRole role : userRoles )
				{
					// en caso d eeque coincida
					if( role.getCveRole( ) == 1 || role.getCveRole( ) == 3 )
					{
						flag = true ;
						
						break ;
					}
				}
				
				if( flag )
				{
					request.setAttribute( "ShowCounts" , new Boolean( true ) ) ;
					request.setAttribute( "UserCounts" , userCounts ) ;
				}
				// en caso de uqe no pertenezca a dichos roles
				else
					request.setAttribute( "ShowCounts" , new Boolean( false ) ) ;
					
				MasterCardDAO.closeEntityManager( ) ;
			  	return mapping.findForward( "error" ) ;
			}
			
			request.setAttribute( "OtherLevels" , appActiveLevels ) ;
			
			// agrega el rol
			request.setAttribute( "AgregarNivelAUsuarioAgregarForm" , f ) ;
			
			// en caso de que se cumpla, guarda el WorkArea
			user.setNextWorkArea( "/WEB-INF/pages/WorkArea/AgregarNivelAUsuario.jsp" ) ;
			
			user.clearMessageError( ) ;
		}catch( MasterCardException mce )
		{
//			System.out.println( "******** error: " + mce ) ;
			MasterCardDAO.closeEntityManager( ) ;
			// verifica el tipo de error
			switch( mce.getErrorCode( ) )
			{
				//  caso de que ya exista el tipo de cuenta con el nombre dado
				case MCUtil.MASTERCARD_ERROR_CODE_CATALOGUE_USER_CAN_NOT_ERASE_LEVEL_FROM_USER :
					user.setMessageError( mce.getSingularMessage( ) ) ;
					
					// en caso de que se cumpla, guarda el WorkArea
					user.setNextWorkArea( "/EditarUsuario.do?regId=" + cveUsuario ) ;
					
				  	return mapping.findForward( "error" ) ;
					
				default :
					user.setMessageError( mce.getSingularMessage( ) ) ;
					
					// en caso de que se cumpla, guarda el WorkArea
					user.setNextWorkArea( "/EditarUsuario.do?regId=" + cveUsuario ) ;
					
				  	return mapping.findForward( "error" ) ;
					
			}
		}
		
                MasterCardDAO.closeEntityManager( ) ;
	  	return mapping.findForward( "success" ) ;
	}
	
}
